<?php

set_time_limit(0);

$address = '127.0.0.1';
$port = 7273;   // 端口可以是1到65535之间的任何数字，前提是未被占用

// 创建并返回一个套接字（通讯节点），一个典型的网络连接由 2 个套接字构成，一个运行在服务器端，另一个运行在客户端
if( ($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket创建失败原因: " . socket_strerror(socket_last_error()) . "\n";
}

// 绑定socket到具体的主机端口
if (socket_bind($sock, $address, $port) === false) {
    echo "创建套接字失败原因: " . socket_strerror(socket_last_error($sock)) . "\n";
}

// 监听socket服务器上的请求连接，等待接入
if (socket_listen($sock, 5) === false) {
    echo "监听失败原因, reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    // 确认客户端的连接请求，成功后，返回一个新的子socket句柄（子线程），用于通信
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() failed, reason: ".socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }

    $msg = "Welcome to connect '$address'"."\n";
    // 发送消息（数据）到客户端
    if (false === socket_write($msgsock, $msg, strlen($msg))){
        echo "socket_write() failed, reason: " . socket_strerror(socket_last_error($sock)) ."\n";
    }

    echo "Read client message \n";
    // 读取客户端的数据
    $receivedData = socket_read($msgsock, 5634);
    echo "Received message: ".$receivedData."\n";;

    // 将客户端发来的数据，进行处理，然后再发送数据给客户端
    $responseData = '[time:'.date('Y-m-d H:i:s').']'.PHP_EOL.'[data:'.trim($receivedData).']';
    if (false === socket_write($msgsock, $responseData, strlen($responseData))) {
        echo "socket_write() failed, reason: " . socket_strerror(socket_last_error($sock)) ."\n";
    }

    // 关闭连接成功的子socket
    socket_close($msgsock);

} while(true);

// 关闭等待接入的socket
socket_close($sock);

?>